//  模拟实现l odash 中的 curry 方法

// const _ = require('lodash')

const sum = (a,b,c)=> a+b+c 

const curried = curry(sum) //将多元参数转为一元参数

console.log(curried(1,2,3)) // 传递sum所有的所有参数的时候， 会立即执行该函数
console.log(curried(1,2)(3)) // 传递部分参数时会返回一个新的函数， 等待剩余的参数被传入
console.log(curried(1)(2,3))

function curry (fun) {
    // ...args 将curry方法第一次接收的参数数组转化为具体的参数
    return function curredFun(...args){ // 声明函数可先在第一次调用的时候将函数混存下来
        console.log('args',args)
        // 判断实参和形参的个数
        if(args.length < fun.length){
            console.log('arguments',arguments)
            // 返回新的函数，并将存储的实惨和剩余的参数合并传递给被之前缓存的curredFun函数
            // arguments是一个伪数组， 将其转化为数组后解析成具体的参数
            return function (){
                return curredFun(...args.concat(Array.from(arguments)))
            }
        }
        return fun(...args)
    }
}